# -*- coding:utf-8 -*-
# @FileName : app\utils\__init__.py
# @Time     : 2025/11/28
# @Author   : 天空之城
"""工具函数模块

此模块包含应用使用的各种纯工具函数，不含业务逻辑。
"""
from .service_checker import (
    check_port_availability,
    wait_for_service_start,
    check_process_output,
    is_process_running,
    terminate_process
)

import hashlib
import random
import string
from datetime import datetime, timedelta



def generate_random_string(length=10):
    """生成随机字符串
    
    Args:
        length: 字符串长度，默认10
    
    Returns:
        随机生成的字符串
    """
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))



def hash_password(password, salt=None):
    """对密码进行哈希处理
    
    Args:
        password: 原始密码
        salt: 盐值，如果为None则自动生成
    
    Returns:
        哈希后的密码和盐值（格式：salt$hashed_password）
    """
    if salt is None:
        salt = generate_random_string(16)
    
    # 使用SHA-256进行哈希
    hashed = hashlib.sha256((password + salt).encode('utf-8')).hexdigest()
    
    return f"{salt}${hashed}"



def verify_password(password, hashed_password):
    """验证密码
    
    Args:
        password: 原始密码
        hashed_password: 哈希后的密码（格式：salt$hashed_password）
    
    Returns:
        布尔值，表示密码是否匹配
    """
    if '$' not in hashed_password:
        return False
    
    salt, hashed = hashed_password.split('$', 1)
    return hash_password(password, salt) == hashed_password



def format_datetime(dt, format_str='%Y-%m-%d %H:%M:%S'):
    """格式化日期时间
    
    Args:
        dt: datetime对象
        format_str: 格式化字符串，默认'%Y-%m-%d %H:%M:%S'
    
    Returns:
        格式化后的日期时间字符串
    """
    if not isinstance(dt, datetime):
        return None
    return dt.strftime(format_str)



def get_pagination_params(request_args, default_page=1, default_per_page=20):
    """获取分页参数
    
    Args:
        request_args: 请求参数对象
        default_page: 默认页码，默认1
        default_per_page: 默认每页数量，默认20
    
    Returns:
        包含page和per_page的字典
    """
    try:
        page = int(request_args.get('page', default_page))
        per_page = int(request_args.get('per_page', default_per_page))
    except ValueError:
        page = default_page
        per_page = default_per_page
    
    # 确保页码和每页数量为正数
    page = max(1, page)
    per_page = max(1, min(100, per_page))  # 限制最大每页数量为100
    
    return {'page': page, 'per_page': per_page}
